package frpc.manager.hash;

import frpc.manager.basics.IRedisBusinessManager;
import frpc.manager.operation.GiveCacheData;
import org.springframework.data.redis.core.HashOperations;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 类描述:  Redis——Hash处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/6/2 0002 下午 3:12
 */
public interface IRedisHashManager extends IRedisBusinessManager {

    /**
     * 功能描述：获取Hash处理对象完成自定义处理
     *
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> HashOperations<String, String, T> giveHashOperations();

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @param time  失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, Map<String, T> value, long time);

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key      需要插入的Key
     * @param valueKey 需要插入的键
     * @param value    需要插入的内容
     * @param time     失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, String valueKey, T value, long time);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, Map<String, T> value);

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key      需要插入的Key
     * @param valueKey 需要插入的键
     * @param value    需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, String valueKey, T value);

    /**
     * 获取数据
     *
     * @param key 键
     * @return 值
     */
    <T> Map<String, T> giveValueByKey(String key);

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @param putMaxTime    存储的时间
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> Map<String, T> giveValueByKeyToLock(String key, GiveCacheData<Map<String, T>> giveCacheData, Long putMaxTime) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> Map<String, T> giveValueByKeyToLock(String key, GiveCacheData<Map<String, T>> giveCacheData) throws Exception;

    /**
     * 删除hash表中的值
     *
     * @param key  键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    <T> void hdel(String key, T... item);

    /**
     * 判断hash表中是否有该项的值
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return true 存在 false不存在
     */
    boolean hHasKey(String key, String item);

    /**
     * 根据存储Key及MapKey获取对应的值
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return 值
     */
    <T> T hget(String key, String item);

    /**
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
     *
     * @param key  键
     * @param item 项
     * @param by   要增加几(大于0)
     * @return 处理结果
     */
    Double hincrToDouble(String key, String item, BigDecimal by);

    /**
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
     *
     * @param key  键
     * @param item 项
     * @param by   要增加几(大于0)
     * @return 结果
     */
    Long hincrToInteger(String key, String item, long by);

    /**
     * hash长度
     *
     * @param key 键
     * @return 长度
     */
    Long hdecrSize(String key);

    /**
     * hash递减
     *
     * @param key  键
     * @param item 项
     * @param by   要减少的值(小于0)
     * @return 结果
     */
    Double hdecrToDouble(String key, String item, BigDecimal by);

    /**
     * hash递减
     *
     * @param key  键
     * @param item 项
     * @param by   要减少记(小于0)
     * @return 结果
     */
    Long hdecrToInteger(String key, String item, long by);
}
